package com.ficus.road.maintain.core.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serializable;


/**
 * 对象查询语言。 查询语言分成两个层级：断言和谓词。 一个具体的查询必须是一个断言。  - 断言：给定一个具体的对象，返回true/false； - 谓词：给定一个具体的对象和对象的一个字段，返回true/false。  举个例子： &#x60;{\&quot;#lt\&quot;: 5}&#x60; 是一个谓词，语义是“小于5”； 而&#x60;{\&quot;timestamp\&quot;: {\&quot;#gt\&quot;: 1, \&quot;#lt\&quot;: 5}}&#x60;是一个断言，其中&#x60;timestamp&#x60;是字段名， 语义是如果被查询对象有&#x60;timestamp&#x60;字段，且其值介于1到5，则满足条件。  形式的定义如下：  - **复合断言**：&#x60;#and&#x60;/&#x60;#or&#x60;。   其操作数是一个断言的array。   例如：&#x60;{\&quot;#and\&quot;: [A0, A1]}&#x60;，其中&#x60;A0&#x60;和&#x60;A1&#x60;是两个断言。   语义是    + 对于&#x60;#and&#x60;，若每一个子断言都满足；   + 对于&#x60;#or&#x60;，若存在一个子断言满足；    则该复合断言满足。  - **基础断言**。   语法是&#x60;{\&quot;fieldName\&quot;: P}&#x60;，其中&#x60;fieldName&#x60;是被查询对象的字段名，&#x60;P&#x60;是一个谓词。   语义是如果被查询对象有&#x60;fieldName&#x60;字段，且该字段的值满足&#x60;P&#x60;，则断言满足。    字段可以是点分多段的形式。   比如：&#x60;foo.bar&#x60;。   &#x60;{\&quot;foo.bar\&quot;: P}&#x60;的语义是，如果被查询对象存在&#x60;foo&#x60;字段，且&#x60;foo&#x60;字段是一个JSON object且其下有&#x60;bar&#x60;字段，且&#x60;bar&#x60;的值满足&#x60;P&#x60;，则断言满足。  - **联立谓词**。   谓词的每一个key-value都是一个子谓词，所有子谓词都满足则该谓词满足。   例如：&#x60;{\&quot;#gt\&quot;: 1, \&quot;#lt\&quot;: 5}&#x60;。   该例子的语义是介于1到5之间。  - **分立谓词**：&#x60;#or&#x60;。   其操作数是一个谓词的array。   例如：&#x60;{\&quot;#or\&quot;: [{\&quot;#lt\&quot;: 3}, {\&quot;#gt\&quot;: 5}]}&#x60;。   语义是如果存在一个子谓词满足，则该复合谓词满足。  - **量词**：&#x60;#any&#x60;/&#x60;#all&#x60;。   其操作数是一个谓词。   若指定对象的指定对象的值是一个array，而我们利用量词检查其中存在某一个元素或每个元素都满足谓词。   例如：&#x60;{\&quot;#any\&quot;: {\&quot;#lt\&quot;: 5}}&#x60;是一个谓词，语义是指定对象的指定字段的值是一个array，且其中存在一个元素小于5。  - **比较谓词**：&#x60;#eq&#x60;/&#x60;#lt&#x60;/&#x60;#gt&#x60;/&#x60;#lte&#x60;/&#x60;#gte&#x60;。   其操作数是任意一个JSON value。   语义是，指定的对象的指定字段的值和操作数的类型可比较，且满足如下大小关系，则谓词满足。    + &#x60;#eq&#x60;: 字段值与操作数相等。对于array或者object，取其自然定义。   + &#x60;#lt&#x60;: 字段值严格小于操作数   + &#x60;#gt&#x60;: 字段值严格大于操作数   + &#x60;#lte&#x60;: 字段值小于等于操作数   + &#x60;#gte&#x60;: 字段值大于等于操作数  - **集合元素谓词**：&#x60;#in&#x60;。   其操作数是an array of JSON value，每个元素的类型不必相同。   语义是，指定的对象的指定字段的值和操作数中的某一个满足&#x60;#eq&#x60;，则该谓词满足。    例如：&#x60;{\&quot;#in\&quot;: [123, \&quot;A\&quot;]}&#x60;。   若指定对象的指定字段的值或者是数值&#x60;123&#x60;，或者是字符串&#x60;A&#x60;，则谓词满足。  - **子串谓词**：&#x60;#contains&#x60;。   其操作数是一个字符串。   语义是指定对象的指定字段的值是一个字符串且操作数是其子串。  - **前缀谓词**：&#x60;#startsWith&#x60;。   其操作数是一个字符串。   语义是指定对象的指定字段的值是一个字符串且操作数是其前缀。  - **多前缀谓词**：&#x60;#startsWithIn&#x60;。   其操作数是一个字符串的array。   语义是指定对象的指定字段的值是一个字符串且操作数中存在一个字符串是其前缀。  - **子树谓词**：&#x60;#subtree&#x60;。   其操作数是[&#x60;TreePointerCompact&#x60;](base_types.html#tag/TreePointerCompact) 格式。   语义是指定对象的指定字段的值是一个[&#x60;TreePointerMap&#x60;](base_types.html#tag/TreePointerMap)且其中存在一个树指针指向操作数所在的子树的某个节点。  - **限定深度子树谓词**：&#x60;#subtreeWithDepth&#x60;。   其操作数是[&#x60;TreePointerCompact&#x60;](base_types.html#tag/TreePointerCompact) 格式和一个树深度。   例如：&#x60;{\&quot;#subtreeWithDepth\&quot;: [\&quot;tree|node\&quot;, 2]}&#x60;。   语义是：    + 指定对象的指定字段的值是一个[&#x60;TreePointerMap&#x60;](base_types.html#tag/TreePointerMap)，   + 且其中存在一个树指针指向操作数所在的子树的某个节点，   + 且这个节点距离子树根的距离不超过指定深度。    其中深度为0指子树根本身。  - **几何点属于谓词**： &#x60;#geoWithin&#x60;。   其操作数是一个[&#x60;GeoShape&#x60;](base_types.html#tag/GeoShape)。   语义是：    - 指定对象的指定字段的是一个[&#x60;GeoLocation&#x60;](base_types.html#tag/GeoLocation)类型字段；   - 且字段值落在
 *
 * @author siyuan.li
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class HitQueryFilterDTO implements Serializable {
//    @JsonProperty("cameraIds")
//    private QueryFilterCommonDTO cameraIds;

    //病害发生时间
    @JsonProperty("hitTime")
    private QueryFilterCommonDTO hitTime;

    @JsonProperty("firstHitTime")
    private QueryFilterCommonDTO firstHitTime;

    @JsonProperty("carIds")
    private QueryFilterCommonDTO carIds;

    @JsonProperty("confirmation")
    private QueryFilterCommonDTO confirmation;

    @JsonProperty("status")
    private QueryFilterCommonDTO status;

    @JsonProperty("source")
    private QueryFilterCommonDTO source;

    @JsonProperty("scene")
    private QueryFilterCommonDTO scene;

    //病害类型
    @JsonProperty("type")
    private QueryFilterCommonDTO type;

    //养护公司
    @JsonProperty("handleCompanyCode")
    private QueryFilterCommonDTO handleCompanyCode;

    //闭环类型
    @JsonProperty("loop")
    private QueryFilterCommonDTO loop;
}

